<template>
  <view>
    <button @tap="authorizeAndTakePhoto">授权相机并拍照</button>
    <button @tap="authorizeAndLogin">授权登录</button>
  </view>
</template>

<script>
export default {
  methods: {
    // 通用的授权函数
    authorizeAndPerformAction(scope, action) {
      // 检查权限授权状态
      uni.getSetting({
        success: (res) => {
          if (res.authSetting[scope]) {
            // 已授权，执行指定的功能
            action();
          } else {
            // 未授权，发起授权请求
            this.requestAuthorization(scope, action);
          }
        },
        fail: (error) => {
          console.error('获取用户授权信息失败', error);
        },
      });
    },

    // 请求权限授权
    requestAuthorization(scope, action) {
      uni.authorize({
        scope: scope,
        success: () => {
          // 用户同意授权，执行指定的功能
          action();
        },
        fail: (error) => {
          // 用户拒绝授权，引导用户打开设置页面
          this.openSetting(scope, action);
        },
      });
    },

    // 打开设置页面
    openSetting(scope, action) {
      uni.showModal({
        title: '提示',
        content: `需要您授权使用${scope}，是否打开设置页面？`,
        success: (res) => {
          if (res.confirm) {
            uni.openSetting({
              success: (settingRes) => {
                // 用户在设置页面授权后，重新检查权限授权状态
                if (settingRes.authSetting[scope]) {
                  // 用户已授权，执行指定的功能
                  action();
                } else {
                  // 用户仍未授权，提示授权失败
                  uni.showToast({
                    title: `授权失败，请在设置中开启${scope}权限`,
                    icon: 'none',
                  });
                }
              },
              fail: (settingError) => {
                console.error('打开设置页面失败', settingError);
              },
            });
          }
        },
      });
    },

    // 示例：授权相机并拍照
    authorizeAndTakePhoto() {
      this.authorizeAndPerformAction('scope.camera', this.takePhoto);
    },

    // 示例：授权登录
    authorizeAndLogin() {
      this.authorizeAndPerformAction('scope.userInfo', this.login);
    },

    // 示例：拍照
    takePhoto() {
      uni.chooseImage({
        sourceType: ['camera'],
        success: (res) => {
          console.log('拍照成功', res);
        },
        fail: (error) => {
          console.error('拍照失败', error);
        },
      });
    },

    // 示例：登录
    login() {
      // 执行登录操作
      console.log('执行登录操作');
    },
  },
};
</script>
